package Local;

import java.util.ArrayList;

public class local {
	
	void solRandom(dgbi.BiGrafo big){
		for(dgbi.Node n : big.iv1){
			big.v1.add((int)(Math.random()*100)%big.v1.size(), n);
		}
		
		for(dgbi.Node n : big.iv2){
			big.v2.add((int)(Math.random()*100)%big.v2.size(), n);
		}
		
		big.iv1.clear();
		big.iv2.clear();
		
	}
        void solConctAlFinal(dgbi.BiGrafo big){  
            // Agrega V1' y V2' al final de V1 y V2 respectivamente 
		for(dgbi.Node n : big.iv1){
			big.insertarEnV1(n, big.v1.size());
		}
		
		for(dgbi.Node n : big.iv2){
			big.insertarEnV2(n, big.v2.size());
		}
		
		big.iv1.clear();
		big.iv2.clear();
		
	}
        private int posNodoFijoAnteriorV1(dgbi.BiGrafo big, int i){
            if(i-1 <=0) return 0;
            if(big.v1.get(i-1).fijo) return (i-1);
            
            for(int pos = i-1; pos >= 0;pos--){
                if(big.v1.get(pos).fijo) return pos;
            }
            
            return -1;  //no hay ninguno fijo anterior a i
        }
        
        private int posNodoFijoAnteriorV2(dgbi.BiGrafo big, int i){
            if(i-1 <=0) return 0;
            if(big.v2.get(i-1).fijo) return (i-1);
            
            for(int pos = i-1; pos >= 0;pos--){
                if(big.v2.get(pos).fijo) return pos;
            }
            return -1;                                  //no hay ninguno fijo anterior a i
        }
        
	public int Busqlocal2(dgbi.BiGrafo big){
	//	System.out.println("Inicio Local...");
           //     solConctAlFinal(big);
//                System.out.println("Cortes Inicial: "+big.cantidadCruces());
                int contador = (big.cantEjesFijo+big.cantEjesParticionAAgregar)*(big.cantEjesFijo+big.cantEjesParticionAAgregar);
               
           //     System.out.println("Cruces Inicial: "+big.cantidadCruces());
                
		int mejorI = -1;
		int mejorJ = -1;
		boolean mejorEnV1 = true;				//si movio 1 nodo en V1 o V2
		
		int cortesAntes = 0;
		int cortesDespues = 0;
		int difCortes = -1;                                     //quiero la max diferencia, 
             //   int difCortes = -1;
                
		boolean mejoro = true;							//si pudo mejorar
	/*	
                for(int pos = 0; pos< big.v1.size();pos++){
                    
                    System.out.print("cortesPos ");
                    System.out.print(pos+" :");
                    System.out.println(big.CortesDeV1(pos));
                }
               */ 
		for(int hasta = contador; hasta>0 && mejoro;hasta--){

			mejoro = false;
			// Por cada nodo de V1 en la pos i
			for(int i = 0; i < big.v1.size();i++){
                                cortesAntes = big.CortesDeV1(i);
                                 // si no esta fijo
				if(!big.v1.get(i).fijo){ //&& !big.v1.get(i+1).fijo){
                                         if(i != 0){
                                            big.moverEnV1(i,0);
                                            
                                            cortesDespues =  big.CortesDeV1(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = true;
							mejoro = true;
						}
                                            }
                                        }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 y me quedo con la mejor
					for(int j = 1; j < big.v1.size();j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
                                                big.swapEnV1(j-1,j);    
                                                if(i != j){                                         // no inserto en la mismo posicion
												//muevo el nodo de i a j
								cortesDespues =  big.CortesDeV1(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = true;
									mejoro = true;
								}
							}
						
						}
					
					}
                                        // restablesco
                                        big.moverEnV1(big.v1.size()-1, i);

				
				}
                                // si i esta fijo
                                else{
                                      int nodoAnt = posNodoFijoAnteriorV1(big,i);
                                      
                                      if(nodoAnt == -1){                    // no hay ninguno fijo anterior a i
                                          big.moverEnV1(i, 0);
                                            
                                            cortesDespues =  big.CortesDeV1(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = true;
							mejoro = true;
						}
                                            }
                                      }
                                      else{
                                        if(nodoAnt != i-1){                         //si no hay uno anterior que esta fijo
                                            
                                            big.moverEnV1(i, nodoAnt+1);

                                            
                                            cortesDespues =  big.CortesDeV1(nodoAnt+1);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = nodoAnt+1;
							mejorEnV1 = true;
							mejoro = true;
						}
                                            }
                                        }
                                      }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 que no me pase de uno fjio y me quedo con la mejor
                                      int j = 0;
					for( j = nodoAnt+2; j < big.v1.size() && !big.v1.get(j).fijo;j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
                                                big.swapEnV1(j-1,j);    
                                                if(i != j){                                     // no inserto en la mismo posicion
												//muevo el nodo de i a j
							cortesDespues =  big.CortesDeV1(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = true;
									mejoro = true;
								}
							}
						
						}
					
					}
                                        // restablesco
                                        big.moverEnV1(j-1, i);
/* 
                                        dgbi.Node n = big.v1.get(j-1);
                                        big.removerEnV1(j-1);
                                        big.insertarEnV1(n, i);
    */
                                }
                                
			}
		
                        // muevo en V2
                        for(int i = 0; i < big.v2.size();i++){
                                
                                 // si no esta fijo
				if(!big.v2.get(i).fijo){ //&& !big.v1.get(i+1).fijo){
                                        cortesAntes = big.CortesDeV2(i);
                                        if(i != 0){
                                            big.moverEnV2(i, 0);
                                            /*
                                            dgbi.Node n = big.v2.get(i);
                                            big.removerEnV2(i);
                                            big.insertarEnV2(n, 0);
                                            */
                                            cortesDespues =  big.CortesDeV2(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = false;
							mejoro = true;
						}
                                            }
                                        }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 y me quedo con la mejor
					for(int j = 1; j < big.v2.size();j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
						big.swapEnV2(j-1,j);					//muevo el nodo de i a j
                                                if(i != j){                                         // no inserto en la mismo posicion

							cortesDespues =  big.CortesDeV2(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = false;
									mejoro = true;
								}
							}
						
						}
					
					}
                                        // restablesco
                                        big.moverEnV2(big.v2.size()-1, i);
/*
                                        dgbi.Node n = big.v2.get(big.v2.size()-1);
                                        big.removerEnV2(big.v2.size()-1);
                                        big.insertarEnV2(n, i);
*/				
				}
                                 // Si i esta fijo
                                else{
                                      int nodoAnt = posNodoFijoAnteriorV2(big,i);
                                        if(nodoAnt == -1){                    // no hay ninguno fijo anterior a i
                                            big.moverEnV2(i, 0);
                                            /*
                                          dgbi.Node n = big.v2.get(i); 
                                            big.removerEnV2(i);
                                            big.insertarEnV2(n, 0);
                                            */
                                            cortesDespues =  big.CortesDeV2(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = false;
							mejoro = true;
						}
                                            }
                                      }
                                      else{
                                        if(nodoAnt != i-1){                         //si no hay uno anterior que esta fijo
                                            
                                            big.moverEnV2(i, nodoAnt+1);
                                            /*
                                            dgbi.Node n = big.v2.get(i);
                                            big.removerEnV2(i);
                                            big.insertarEnV2(n, nodoAnt+1);
                                            */
                                            cortesDespues =  big.CortesDeV2(nodoAnt+1);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = nodoAnt+1;
							mejorEnV1 = false;
							mejoro = true;
						}
                                            }
                                        }
                                      }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 que no me pase de uno fjio y me quedo con la mejor
                                      int j = 0;
					for( j = nodoAnt+2; j < big.v2.size() && !big.v2.get(j).fijo;j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
                                                big.swapEnV2(j-1,j);    
                     //                          if(i != j){                                     // no inserto en la mismo posicion
												//muevo el nodo de i a j
							cortesDespues =  big.CortesDeV2(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = false;
									mejoro = true;
								}
							}
						
			//			}
					
					}
                                        // restablesco
                                        big.moverEnV2(j-1, i);
 /*
                                        dgbi.Node n = big.v2.get(j-1);
                                        big.removerEnV2(j-1);
                                        big.insertarEnV2(n, i);
   */
                                }
			}
		
		//	Actualizo Solucion
			if(mejoro){
				
/*				System.out.println("Mejoro");
                                System.out.print("difCortesL: ");
                                System.out.println(difCortes);
                                
  */                              
				if(mejorEnV1)
					big.moverEnV1(mejorI,mejorJ);	
				else
					big.moverEnV2(mejorI,mejorJ);
			}
//			else
//				System.out.println("no Mejoro");
                    
                   difCortes = -1;
		}
  //              System.out.println("Cruces final: "+big.cantidadCruces());
                return big.cantidadCruces();
	}
               
               
               
        public int Busqlocal(dgbi.BiGrafo big){
	//	System.out.println("Inicio Local...");
           //     solConctAlFinal(big);
//                System.out.println("Cortes Inicial: "+big.cantidadCruces());
                int contador = (big.cantEjesFijo+big.cantEjesParticionAAgregar)*(big.cantEjesFijo+big.cantEjesParticionAAgregar);
               
           //     System.out.println("Cruces Inicial: "+big.cantidadCruces());
                
		int mejorI = -1;
		int mejorJ = -1;
		boolean mejorEnV1 = true;				//si movio 1 nodo en V1 o V2
		
		int cortesAntes = 0;
		int cortesDespues = 0;
		int difCortes = -1;                                     //quiero la max diferencia, 
             //   int difCortes = -1;
                
		boolean mejoro = true;	//si pudo mejorar

	/*	
                for(int pos = 0; pos< big.v1.size();pos++){
                    
                    System.out.print("cortesPos ");
                    System.out.print(pos+" :");
                    System.out.println(big.CortesDeV1(pos));
                }
               */ 
		for(int hasta = contador; hasta>0 && mejoro;hasta--){

			mejoro = false;
			// Por cada nodo de V1 en la pos i
			for(int i = 0; i < big.v1.size();i++){
                                
                                 // si no esta fijo
				if(!big.v1.get(i).fijo){ //&& !big.v1.get(i+1).fijo){
                                        cortesAntes = big.CortesDeV1(i);
                                        if(i != 0){
 
                                            big.moverEnV1(i, 0);
/*                                            
                                            dgbi.Node n = big.v1.get(i);
                                            big.removerEnV1(i);
                                            big.insertarEnV1(n, 0);
  */                                          
                                            cortesDespues =  big.CortesDeV1(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = true;
							mejoro = true;

						}
                                            }
                                        }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 y me quedo con la mejor
					for(int j = 1; j < big.v1.size();j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
                                                big.swapEnV1(j-1,j);    
                       //                         if(i != j){                                         // no inserto en la mismo posicion
												//muevo el nodo de i a j
								cortesDespues =  big.CortesDeV1(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = true;
									mejoro = true;
         
								}
							}
						
			//			}
					
					}
                                        // restablesco
                                        big.moverEnV1(big.v1.size()-1, i);
 /*
                                        dgbi.Node n = big.v1.get(big.v1.size()-1);
                                        big.removerEnV1(big.v1.size()-1);
                                        big.insertarEnV1(n, i);
*/				
				}
			}
		
                        // muevo en V2
                        for(int i = 0; i < big.v2.size();i++){
                                
                                 // si no esta fijo
				if(!big.v2.get(i).fijo){ //&& !big.v1.get(i+1).fijo){
                                        cortesAntes = big.CortesDeV2(i);
                                        if(i != 0){
     
                                            big.moverEnV2(i, 0);
/*                                            dgbi.Node n = big.v2.get(i);
                                            big.removerEnV2(i);
                                            big.insertarEnV2(n, 0);
  */                                          
                                            cortesDespues =  big.CortesDeV2(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = false;
							mejoro = true;
  
						}
                                            }
                                        }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 y me quedo con la mejor
					for(int j = 1; j < big.v2.size();j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
						big.swapEnV2(j-1,j);					//muevo el nodo de i a j
               //                                 if(i != j){                                         // no inserto en la mismo posicion

							cortesDespues =  big.CortesDeV2(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = false;
									mejoro = true;
    
								}
							}
						
			//			}
					
					}
                                        // restablesco
                                        big.moverEnV2(big.v2.size()-1, i);
/*
                                        dgbi.Node n = big.v2.get(big.v2.size()-1);
                                        big.removerEnV2(big.v2.size()-1);
                                        big.insertarEnV2(n, i);
	*/			
				}
			}
		
		//	Actualizo Solucion
			if(mejoro){
				
				System.out.println("Mejoro");
                                System.out.print("difCortesL: ");
                                System.out.println(difCortes);
                                
                               
				if(mejorEnV1)

					big.moverEnV1(mejorI,mejorJ);	
				else
 					big.moverEnV2(mejorI,mejorJ);
			}
//			else
//				System.out.println("no Mejoro");
                    
                   difCortes = -1;
		}
  //              System.out.println("Cruces final: "+big.cantidadCruces());
                return big.cantidadCruces();
	}
        
          public int BusqlocalRnd(dgbi.BiGrafo big){
	//	System.out.println("Inicio Local...");
                solRandom(big);
//                System.out.println("Cortes Inicial: "+big.cantidadCruces());
                int contador = (big.cantEjesFijo+big.cantEjesParticionAAgregar)*(big.cantEjesFijo+big.cantEjesParticionAAgregar);
               
           //     System.out.println("Cruces Inicial: "+big.cantidadCruces());
                
		int mejorI = -1;
		int mejorJ = -1;
		boolean mejorEnV1 = true;				//si movio 1 nodo en V1 o V2
		
		int cortesAntes = 0;
		int cortesDespues = 0;
		int difCortes = -1;                                     //quiero la max diferencia, 
             //   int difCortes = -1;
                
		boolean mejoro = true;							//si pudo mejorar
	/*	
                for(int pos = 0; pos< big.v1.size();pos++){
                    
                    System.out.print("cortesPos ");
                    System.out.print(pos+" :");
                    System.out.println(big.CortesDeV1(pos));
                }
               */ 
		for(int hasta = contador; hasta>0 && mejoro;hasta--){

			mejoro = false;
			// Por cada nodo de V1 en la pos i
			for(int i = 0; i < big.v1.size();i++){
                                
                                 // si no esta fijo
				if(!big.v1.get(i).fijo){ //&& !big.v1.get(i+1).fijo){
                                        cortesAntes = big.CortesDeV1(i);
                                        if(i != 0){
      
                                            big.moverEnV1(i, 0);
                     //                      dgbi.Node n = big.v1.get(i);

                     //                       big.removerEnV1(i);
                     //                       big.insertarEnV1(n, 0);
                                            
                                            cortesDespues =  big.CortesDeV1(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = true;
							mejoro = true;
						}
                                            }
                                        }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 y me quedo con la mejor
					for(int j = 1; j < big.v1.size();j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
                                                big.swapEnV1(j-1,j);    
                                                if(i != j){                                         // no inserto en la mismo posicion
												//muevo el nodo de i a j
								cortesDespues =  big.CortesDeV1(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = true;
									mejoro = true;
								}
							}
						
						}
					
					}
                                        // restablesco
                                        big.moverEnV1(big.v1.size()-1, i);
 
 
/*                                        dgbi.Node n = big.v1.get(big.v1.size()-1);
                                        big.removerEnV1(big.v1.size()-1);
                                        big.insertarEnV1(n, i);
*/				
				}
			}
		
                        // muevo en V2
                        for(int i = 0; i < big.v2.size();i++){
                                
                                 // si no esta fijo
				if(!big.v2.get(i).fijo){ //&& !big.v1.get(i+1).fijo){
                                        cortesAntes = big.CortesDeV2(i);
                                        if(i != 0){
                                            big.moverEnV2(i, 0);
/*                                            dgbi.Node n = big.v2.get(i);
                                            big.removerEnV2(i);
                                            big.insertarEnV2(n, 0);
  */                                          
                                            cortesDespues =  big.CortesDeV2(0);
                                            if(cortesAntes > cortesDespues){
						if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
							difCortes = cortesAntes-cortesDespues;
							mejorI = i;
							mejorJ = 0;
							mejorEnV1 = false;
							mejoro = true;
						}
                                            }
                                        }
                                            
                                        // lo swapeo a cada posicion j consec dentro de V1 y me quedo con la mejor
					for(int j = 1; j < big.v2.size();j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
						big.swapEnV2(j-1,j);					//muevo el nodo de i a j
                                                if(i != j){                                         // no inserto en la mismo posicion

							cortesDespues =  big.CortesDeV2(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = false;
									mejoro = true;
								}
							}
						
						}
					
					}
                                        // restablesco
                                        big.moverEnV2(big.v2.size()-1, i);
/*
                                        dgbi.Node n = big.v2.get(big.v2.size()-1);
                                        big.removerEnV2(big.v2.size()-1);
                                        big.insertarEnV2(n, i);
*/				
				}
			}
		
                        
		//	Actualizo Solucion
			if(mejoro){
				
/*				System.out.println("Mejoro");
                                System.out.print("difCortesL: ");
                                System.out.println(difCortes);
                                
     */                           
                               
                            
        			if(mejorEnV1)
					big.moverEnV1(mejorI,mejorJ);	
				else
					big.moverEnV2(mejorI,mejorJ);
			}
//			else
//				System.out.println("no Mejoro");
                    
                   difCortes = -1;
		}
  //              System.out.println("Cruces final: "+big.cantidadCruces());
                return big.cantidadCruces();
	}
        
        
        
	/*
         
         
        public int Busqlocal(dgbi.BiGrafo big){
		System.out.println("Inicio Local...");
                solConctAlFinal(big);
                System.out.println("Cortes Inicial: "+big.cantidadCruces());
                int contador = (big.cantEjesFijo+big.cantEjesParticionAAgregar)*(big.cantEjesFijo+big.cantEjesParticionAAgregar);
               
           //     System.out.println("Cruces Inicial: "+big.cantidadCruces());
                
		int mejorI = -1;
		int mejorJ = -1;
		boolean mejorEnV1 = true;				//si movio 1 nodo en V1 o V2
		
		int cortesAntes = 0;
		int cortesDespues = 0;
		int difCortes = -1;                                     //quiero la max diferencia, 
             //   int difCortes = -1;
                
		boolean mejoro = true;							//si pudo mejorar
		
                for(int pos = 0; pos< big.v1.size();pos++){
                    
                    System.out.print("cortesPos ");
                    System.out.print(pos+" :");
                    System.out.println(big.CortesDeV1(pos));
                }
               
		for(int hasta = contador; hasta>0 && mejoro;hasta--){

			mejoro = false;
			// Por cada nodo de V1 en la pos i
			for(int i = 0; i < big.v1.size();i++){
                                
                                 // si no esta fijo
				if(!big.v1.get(i).fijo){ //&& !big.v1.get(i+1).fijo){
                                        cortesAntes = big.CortesDeV1(i);
                                        // lo muevo a cada posicion j dentro de V1 y me quedo con la mejor
					for(int j = 0; j <= big.v1.size();j++){     //llego hasta <= porque puedo insertar en la ulttima posicion
                                                if(i != j && j != i+1){                                         // no inserto en la mismo posicion
							big.moverEnV1(i,j);					//muevo el nodo de i a j
							if(i<j)
								cortesDespues =  big.CortesDeV1(j-1);
							else
								cortesDespues =  big.CortesDeV1(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes-cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = true;
									mejoro = true;
								}
							}
						
                                                        if(j<i){
                                                            big.moverEnV1(j,i);

                                                        }
                                                        else{
                                                            big.moverEnV1(j-1,i);
                                                         }
											//muevo el nodo de j a i
						
						}
					
					}
				
				}
			}
		
			// Mover nodos dentro de V2
			for(int i = 0; i < big.v2.size();i++){
				if(!big.v2.get(i).fijo){ 
                                    cortesAntes = big.CortesDeV2(i);
					for(int j = 0; j <= big.v2.size();j++){
						if(i != j && j != i+1){
							big.moverEnV2(i,j);					//muevo el nodo de i a j
							if(i<j)
								cortesDespues =  big.CortesDeV2(j-1);
							else
								cortesDespues =  big.CortesDeV2(j);
							if(cortesAntes > cortesDespues){
								if((cortesAntes - cortesDespues > difCortes) || (difCortes ==-1)){
									difCortes = cortesAntes-cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = false;
									mejoro = true;
								}
							}
                                                        if(j<i){
                                                            big.moverEnV2(j,i);

                                                        }
                                                        else{
                                                            big.moverEnV2(j-1,i);
                                                         }
						
						}
					
					}
				
				}
			}
		
		//	Actualizo Solucion
			if(mejoro){
				
				System.out.println("Mejoro");
                                System.out.print("difCortesL: ");
                                System.out.println(difCortes);
                                
                                
				if(mejorEnV1)
					big.moverEnV1(mejorI,mejorJ);	
				else
					big.moverEnV2(mejorI,mejorJ);
			}
			else
				System.out.println("no Mejoro");
                    
                   difCortes = -1;
		}
                System.out.println("Cruces final: "+big.cantidadCruces());
                return big.cantidadCruces();
	} 
         */
        /*
	private static void insertar(ArrayList<dgbi.Node> v, int i, int j){
		dgbi.Node n = v.get(i);
		v.remove(i);
		if(i<j){
			v.add(j-1, n);
		}
		else{
			v.add(j, n);
		}
	}
	
	private static void restablecer(dgbi.BiGrafo big, ArrayList<dgbi.Node> v, int j, int i){

		if(j<i){
			dgbi.Node n = v.get(j);
			v.remove(j);
			v.add(i, n);
		}
		else{
			dgbi.Node n = v.get(j-1);
			v.remove(j-1);
			v.add(i, n);
		}
		
	}
	*/
	
}